﻿var $ = layui.jquery;

var abc = app = {
    // tablePrimaryKey="Id",//设置默认主键Id



    /**
     *  Index 页面初始化
     */
    indexInit: function (options) {
        var $ = layui.jquery;

        options = options ? options : {};
        var reset = options.reset ? options.reset : '#reset';
        if (reset.indexOf("#") != 0) {
            reset = '#' + reset;
        }
        var search = options.search ? options.search : '#search';
        if (search.indexOf("#") != 0) {
            search = '#' + search;
        }
        //重置搜索条件
        $(reset).on("click", function () {
            //resetcallback
            if (options.resetCallBack != undefined && options.resetCallBack != null) {
                options.resetCallBack();
            }
            setTimeout(function () {
                $(search).click();
            }, 300);
        });
    },
    /*
     * Info页面 初始化
     * */
    infoInit: function () {
        //let $ = layui.jquery;
        //$(".closewindow").on('click', function () {
        //    //当你在iframe页面关闭自身时
        //    var index = parent.layer.getFrameIndex(window.name); //先得到当前iframe层的索引
        //    parent.layer.close(index); //再执行关闭
        //});
        //$(".refreshwindow").on('click', function () {
        //    location.reload();
        //});
    },

    /**
     *  初始化表格 Pear Table
     * @param {any} table  //table 对象
     * @param {any} tableid  //table ID
     * @param {any} cols   //表格列 array
     * @param {any} options   //其它可选参数
     * 与layui参数基本一致
     * options:{title:title,page:true,totalRow:false,limit:15,size:'sm',done:完成后调用的方法}
     */
    initTable: function (tableid, cols, options) {
        // title, size, skin, limit, limits, toolbarid, page
        let table = layui.table;

        //https://www.layui.com/doc/modules/table.html
        table.render({
            elem: '#' + tableid,
            cols: cols,
            data: [], //直接赋值数据
            title: options.title != undefined ? options.title : tableid, //定义 table 的大标题（在文件导出等地方会用到）
            text: options.text != undefined ? options.text : {
                none: abc.translate("无数据")
            }, //自定义文本，如空数据时的异常提示等
            url: options.url != undefined ? options.url : null, //异步数据接口相关参数。其中 url 参数为必填项
            page: options.page != undefined ? options.page : true, //开启分页（ 默认： false）
            cellMinWidth: options.cellMinWidth != undefined ? options.cellMinWidth : 90, //全局定义所有常规单元格的最小宽度（默认：60），一般用于列宽自动分配的情况。其优先级低于表头参数中的 minWidth
            method: options.method != undefined ? options.method : 'post',
            height: options.height != undefined ? options.height : null, //设定容器高度
            totalRow: options.totalRow != undefined ? options.totalRow : false, //是否开启合计行区域
            skin: options.skin != undefined ? options.skin : null, //设定表格各种外观、尺寸等
            toolbar: options.toolbar != undefined ? options.toolbar : '#toolbar', //开启表格头部工具栏区域，该参数支持四种类型值：
            limit: options.limit != undefined ? options.limit : 15, //每页显示的条数（默认：10）
            limits: options.limits != undefined ? options.limits : [15, 25, 50, 80, 100], //每页条数的选择项，默认：[10,20,30,40,50,60,70,80,90]。
            size: options.size != undefined ? options.size : 'sm', //设定表格尺寸 sm 小尺寸、lg 大尺寸
            defaultToolbar: options.defaultToolbar != undefined ? options.defaultToolbar : [{
                title: abc.translate("刷新"),//'刷新|refresh',
                layEvent: 'refresh',
                icon: 'layui-icon-refresh',
            }, 'filter', 'exports'],
            loading: options.loading != undefined ? options.loading : true, //是否显示加载条（默认：true）
            autoSort: options.autoSort != undefined ? options.autoSort : false, //默认 true，即直接由 table 组件在前端自动处理排序
            /* initSort: options.initSort ? options.initSort : {},*/ //初始排序状态。用于在数据表格渲染完毕时，默认按某个字段排序。

            even: options.even != undefined ? options.even : true, //开启隔行背景
            done: options.done,
            //done: function(res, curr, count) {
            //    if (options.done != null || options.done != undefined) {
            //        options.done(res, curr, count);
            //    }
            //}
        });
    },
    /**
    * 搜索
    * @param {any} table  // table 对象
    * @param {any} url  //提交地址
    * @param {any} query  //提交数据
    * @param {any} tableid  //table ID
    * @param {any} options   //其它可选参数
    */
    search: function (tableid, url, searchQuery, options) {
        let table = layui.table;
        tableid = tableid != undefined ? tableid : 'listData';
        options = options != undefined ? options : {};
        searchQuery = abc.addRequestVerificationToken(searchQuery);
        table.reload(tableid, {
            url: url,
            page: {
                curr: options.curr != undefined ? options.curr : 1 //重新从第 1 页开始
            },
            method: options.method != undefined ? options.method : "POST", //如果无需自定义HTTP类型，可不加该参数
            where: searchQuery ? searchQuery : {}, //设定异步数据接口的额外参数
            done: function (res, curr, count) {
                if (options.done != null || options.done != undefined) {
                    options.done(res, curr, count);
                }
            },
        });
    },
    /**
     *  初始化表格 treetable
     * @param {any} tableid  //table ID
     * @param {any} cols   //表格列 array
     * @param {any} options   //其它可选参数
     * 与layui参数基本一致
     */
    treeTableRender: function (tableid, cols, options) {
        let treeTable = layui.treeTable;

        // 渲染
        var inst = treeTable.render({
            elem: '#' + tableid,
            url: options.url, // 
            tree: options.tree,
            maxHeight: options.maxHeight != undefined ? options.maxHeight : undefined,
            toolbar: options.toolbar != undefined ? options.toolbar : '#toolbar',
            cols: cols,
            page: options.page != undefined ? options.page : false,//默认不分页
            done: options.done,
            method: options.method != undefined ? options.method : 'post',
        });
        return inst;
        //treetable.render({
        //    treeColIndex: options.treeColIndex != undefined ? options.treeColIndex : 1,
        //    treeSpid: options.treeSpid != undefined ? options.treeSpid : 0,
        //    treeIdName: options.treeIdName != undefined ? options.treeIdName : "Id", //'powerId',
        //    treePidName: options.treePidName != undefined ? options.treePidName : "Pid", //'parentId',
        //    skin: options.skin != undefined ? options.skin : 'line',
        //    method: options.method != undefined ? options.method : 'post',
        //    treeDefaultClose: options.treeDefaultClose != undefined ? options.treeDefaultClose : true,
        //    toolbar: options.toolbar != undefined ? options.toolbar : '#toolbar',
        //    elem: '#' + tableid,
        //    url: options.url, //'../../admin/data/power.json',
        //    page: options.page != undefined ? options.page : false,
        //    cols: cols
        //});
    },

    /**
    * 搜索
    * @param {any} tableid  //table ID
    * @param {any} url  //提交地址
    * @param {any} searchQuery  //提交数据
    * @param {any} options   //其它可选参数
    */
    treeTableSearch: function (tableid, url, searchQuery, options) {
        let table = layui.treeTable;
        tableid = tableid != undefined ? tableid : 'listData';
        options = options != undefined ? options : {};
        searchQuery = abc.addRequestVerificationToken(searchQuery);
        table.reload(tableid, {
            url: url,
            page: options.page != undefined ? options.page : false,//默认不分页
            method: options.method != undefined ? options.method : "POST", //如果无需自定义HTTP类型，可不加该参数
            where: searchQuery ? searchQuery : {}, //设定异步数据接口的额外参数
            done: function (res, curr, count) {
                if (options.done != null || options.done != undefined) {
                    options.done(res, curr, count);
                }
            },
        });
    },

    /**
     *  获取Table选中的数据 Id
     * @param {any} table //table 对象
     * @param {any} tableid  //tableID
     */
    getSelectDataIds: function (table, tableid) {
        tableid = tableid ? tableid : 'listData'
        var $ = layui.jquery;
        var checkStatus = table.checkStatus(tableid),
            data = checkStatus.data;
        var ids = "";
        $.each(data, function (index, item) {
            ids += item.Id + ",";
        });
        if (ids.length > 0) {
            ids = ids.substring(0, ids.length - 1);
        }
        return ids;
    },
    /**
     *  获取Table选中的数据 Id
     * @param {any} table //table 对象
     * @param {any} tableid  //tableID
     */
    getSelectDataIdsToArray: function (table, tableid) {
        var idsstr = abc.getSelectDataIds(table, tableid);
        return idsstr.split(',');
    },
    /**
     *  initDate 初始化 时间
     * @param {any} dates //日期 input id字符串
     * @param {any} type //类型 年(year),月（month），日(不传就是)，时间（time）,日期时间（datetime）
     * @param {any} range  //range: true //或 range: '~' 来自定义分割字符
     * @param {any} format //显示格式 默认：yyyy-MM-dd
     */
    initDate: function (dates, type, range, format) {
        abc.initDate2({ elems: dates, type: type, range: range, format: format });
    },
    /**
     *  initDate 初始化 时间
     * @param {any} options 选项参数
     * // dates //日期 input id字符串
     * // type //类型 年(year),月（month），日(不传就是)，时间（time）,日期时间（datetime）
     * // range  //range: true //或 range: '~' 来自定义分割字符
     * // format //显示格式 默认：yyyy-MM-dd
     * // lang  //内置了两种语言版本：cn（中文版）、en（国际版，即英文版）
     */
    initDate2: function (options) {
        if (options.elems === undefined || options.elems === '' || options.elems === null) return;
        let laydate = layui.laydate;
        options.type = options.type != undefined ? options.type : ''; //为空表示 选择为：日
        options.range = options.range != undefined ? options.range : false;
        options.format = options.format != undefined ? options.format : 'yyyy-MM-dd';
        options.lang = options.lang != undefined ? options.lang : 'cn';
        /*  layui.use('laydate', function() {*/
        var arrDateEle = options.elems.split(',');
        for (var i = 0; i < arrDateEle.length; i++) {
            if (options.type === undefined || options.type === '' || options.type === null) {
                laydate.render({
                    elem: '#' + arrDateEle[i],
                    format: options.format, // "yyyy-MM-dd HH:mm:ss"
                    range: options.range
                    , lang: options.lang
                });
            } else {
                laydate.render({
                    elem: '#' + arrDateEle[i],
                    type: options.type, //datetime
                    format: options.format, // "yyyy-MM-dd HH:mm:ss"
                    range: options.range
                    , lang: options.lang
                });
            }
        }
    },
    /**
     *  Post 数据
     *  必须参数：url、data
     *  回调方法：success:window.refresh、fail:失败调用方法
     *  弹框消息 isMsg:true、successMsg:"操作成功"、failMsg:"操作失败"
     */
    post: function (options) {
        //submitbtn  //点击提交的按钮
        let $ = layui.jquery;
        let layer = layui.layer;

        options = options != undefined ? options : {};

        //是否默认furion的统一返回格式，默认为true
        options.isFurionResult = options.isFurionResult != undefined ? options.isFurionResult : true;
        //是否弹出默认提示消息，默认返回格式为furion的统一返回格式对象,默认使用默认弹出消息
        options.isDefaultAlertMsg = options.isDefaultAlertMsg != undefined ? options.isDefaultAlertMsg : true;

        //是否成功关闭窗口
        options.IsSuccessCloseWindow = options.IsSuccessCloseWindow != undefined ? options.IsSuccessCloseWindow : false;
        //默认禁用按钮后，自动延迟3秒恢复
        options.isAutoEnableBtn = options.isAutoEnableBtn != undefined ? options.isAutoEnableBtn : true;
        //默认表单形式提交
        options.contentType = options.contentType != undefined ? options.contentType : "application/x-www-form-urlencoded";
        //禁用提交按钮
        abc.DisableSubmitBtn(options);

        options.data = abc.addRequestVerificationToken(options.data);
        //是否显示加载状态动画
        options.isloading = options.isloading != undefined ? options.isloading : true;

        var loading;
        if (options.isloading == true) {
            loading = layer.load();
        }
        $.ajax({
            type: "POST",
            url: options.url,
            contentType: options.contentType, //如果提交的是json数据类型，则必须有此参数,表示提交的数据类型
            //dataType: "json", //表示返回值类型，不必须
            data: options.data,
            success: function (result) {
                layer.close(loading);
                //如果有完成方法，则调用
                if (options.done != null && options.done != undefined) {
                    options.done(result);
                }
                //判断是否furion的返回格式，如果是才执行，不是则不执行
                if (options.isFurionResult) {
                    if (result.Succeeded) {
                        if (options.success != null && options.success != undefined) {
                            options.success(result);
                            //关闭layer弹出的窗口
                            if (options.IsSuccessCloseWindow) {
                                abc.CloseNowWindow(options.IsSuccessCloseWindow);
                            }
                        }
                        else {
                            //默认使用弹出消息、furion格式的
                            if (options.isDefaultAlertMsg) {
                                abc.tipMsg({ succeeded: result.Succeeded, errors: result.Errors, successMsg: options.successMsg, failMsg: options.failMsg });
                            }
                            //关闭layer弹出的窗口
                            if (options.IsSuccessCloseWindow) {
                                abc.CloseNowWindow(options.IsSuccessCloseWindow);
                            }
                        }
                        //不自动关闭执行
                        if (options.IsSuccessCloseWindow == false) {
                            if (options.isAutoEnableBtn == true) {
                                //启用提交按钮
                                abc.EnableSubmitBtn(options)
                            }
                        }
                    } else {
                        if (options.fail != null && options.fail != undefined) {
                            options.fail(result);
                        }
                        else {
                            //默认使用弹出消息、furion格式的
                            if (options.isDefaultAlertMsg) {
                                abc.tipMsg({ succeeded: result.Succeeded, errors: result.Errors, successMsg: options.successMsg, failMsg: options.failMsg });
                            }
                        }
                        //失败了，自动启用按钮
                        //启用提交按钮
                        options.timeout = 3000;
                        abc.EnableSubmitBtn(options)
                    }
                }
                else {
                    abc.EnableSubmitBtn(options)
                }
            },
            error: function (response) {
                layer.close(loading);
                console.log(response.responseText);
                //启用提交按钮
                abc.EnableSubmitBtn(options)
                //如果有完成方法，则调用
                if (options.error != null && options.error != undefined) {
                    options.error(response);
                }
                else {
                    if (response.status == 400) {
                        abc.failure('提交失败，请刷新页面重试!</br>failed to submit，please refresh the page and try again!');
                    }
                    else {
                        abc.failure('提交错误，请刷新页面重试!</br>error to submit，please refresh the page and try again!');
                    }
                }
            }
        });
    },
    /**
     * POST 方式下载文件
     * 后端的方法必须同时支持 get和post
     * */
    downfile: function (options) {
        //params是post请求需要的参数，url是请求url地址
        var form = document.createElement("form");
        form.style.display = "none";
        form.action = options.url;
        form.method = "post";
        document.body.appendChild(form);

        options.data = abc.addRequestVerificationToken(options.data);

        // 动态创建input并给value赋值
        for (var key in options.data) {
            var input = document.createElement("input");
            input.type = "hidden";
            input.name = key;
            input.value = options.data[key];
            form.appendChild(input);
        }

        form.submit();
        form.remove();
    },
    /**
     *  Get 数据
     *  必须参数：url、data
     *  回调方法：success:window.refresh、fail:失败调用方法
     *  弹框消息 isMsg:true、successMsg:"操作成功"、failMsg:"操作失败"
     */
    get: function (options) {
        //submitbtn  //点击提交的按钮
        let $ = layui.jquery;
        let layer = layui.layer;

        options = options != undefined ? options : {};
        //默认禁用按钮后，自动延迟3秒恢复
        options.isAutoEnableBtn = options.isAutoEnableBtn != undefined ? options.isAutoEnableBtn : true;
        //默认表单形式提交
        options.contentType = options.contentType != undefined ? options.contentType : "application/x-www-form-urlencoded";
        //禁用提交按钮
        abc.DisableSubmitBtn(options);

        options.data = abc.addRequestVerificationToken(options.data);
        //是否显示加载状态动画
        options.isloading = options.isloading != undefined ? options.isloading : true;

        var loading;
        if (options.isloading == true) {
            loading = layer.load();
        }
        $.ajax({
            type: "POST",
            url: options.url,
            contentType: options.contentType, //如果提交的是json数据类型，则必须有此参数,表示提交的数据类型
            //dataType: "json", //表示返回值类型，不必须
            data: options.data,
            success: function (result) {
                layer.close(loading);
                //如果有完成方法，则调用
                if (options.done != null && options.done != undefined) {
                    options.done(result);
                }
                //如果有完成方法，则调用
                if (options.success != null && options.success != undefined) {
                    options.success(result);
                }
                //启用提交按钮
                options.timeout = 3000;
                abc.EnableSubmitBtn(options)
            },
            error: function (response) {
                layer.close(loading);
                console.log(response.responseText);

                //启用提交按钮
                abc.EnableSubmitBtn(options)

                //如果有完成方法，则调用
                if (options.error != null && options.error != undefined) {
                    options.error(response);
                }
                else {
                    abc.failure(abc.translate('获取失败'));
                }
            }
        });
    },

    /**
     * 关闭layer 弹出的当前窗口
     */
    CloseNowWindow: function () {
        //如果成功，关闭窗口
        //延迟3秒钟移除禁用状态
        setTimeout(function () {
            if (parent != null && parent.layer != null) {
                //关闭弹出窗口
                var index1 = parent.layer.getFrameIndex(window.name); //先得到当前iframe层的索引
                parent.layer.close(index1); //再执行关闭
            }
        }, 3000)
    },
    /**
     * 禁用提交按钮
     * @param {any} options
     */
    DisableSubmitBtn: function (options) {
        let $ = layui.jquery;
        let DISABLED = 'layui-btn-disabled';//定义的变量

        options = options != undefined ? options : {};
        //提交的按钮
        options.submitbtn = options.submitbtn != undefined ? options.submitbtn : ".submitbtn";
        if (options.submitbtn != undefined && options.submitbtn != null) {
            if (options.submitbtn.indexOf(".") != 0) {
                options.submitbtn = '.' + options.submitbtn;
            }
            //禁用按钮
            $(options.submitbtn).css('pointer-events', 'none');
            $(options.submitbtn).addClass(DISABLED)
            $(options.submitbtn).attr('disabled', true)
        }
    },
    /**
     * 启用提交按钮
     * @param {any} options
     */
    EnableSubmitBtn: function (options) {
        //submitbtn, timeout
        let $ = layui.jquery;

        options = options != undefined ? options : {};

        options.timeout = options.timeout != undefined ? options.timeout : 1000;//启用倒计时 默认 3000毫秒
        let DISABLED = 'layui-btn-disabled';//定义的变量
        //提交的按钮
        options.submitbtn = options.submitbtn != undefined ? options.submitbtn : ".submitbtn";
        if (options.submitbtn != undefined && options.submitbtn != null) {
            if (options.submitbtn.indexOf(".") != 0) {
                options.submitbtn = '.' + options.submitbtn;
            }
            //延迟3秒钟移除禁用状态
            setTimeout(function () {
                //$(submitbtn).css({ 'pointer-events': 'none' });
                $(options.submitbtn).css("pointer-events", "");
                //移除禁用状态
                $(options.submitbtn).removeClass(DISABLED);
                //$(submitbtn).removeAttr('disabled');
                $(options.submitbtn).attr('disabled', false)
            }, options.timeout);
        }
    },

    /**
     *  Post 数据
     * {url:url,data:data,success:window.refresh,fail:失败调用方法}
     */
    ajax: function (options) {
        let $ = layui.jquery;
        let layer = layui.layer;

        options = options != undefined ? options : {};
        //是否默认furion的统一返回格式，默认为true
        options.isFurionResult = options.isFurionResult != undefined ? options.isFurionResult : true;
        //是否弹出默认提示消息，默认返回格式为furion的统一返回格式对象,默认使用默认弹出消息
        options.isDefaultAlertMsg = options.isDefaultAlertMsg != undefined ? options.isDefaultAlertMsg : true;
        options.data = abc.addRequestVerificationToken(options.data);
        //是否显示加载状态动画
        options.isloading = options.isloading != undefined ? options.isloading : true;

        var loading;
        if (options.isloading == true) {
            loading = layer.load();
        }
        $.ajax({
            type: "POST",
            url: options.url,
            contentType: "application/json", //如果提交的是json数据类型，则必须有此参数,表示提交的数据类型
            //dataType: "json", //表示返回值类型，不必须
            data: options.data,
            success: function (result) {
                layer.close(loading);

                //如果有完成方法，则调用
                if (options.done != null && options.done != undefined) {
                    options.done(result);
                }

                //在原来的页面跳转到下载word模板的页面
                // window.location.href = "/InviteBid/ExportTemplateFile";
                if (result.Succeeded) {
                    if (options.success != null && options.success != undefined) {
                        options.success(result);
                    }
                } else {
                    if (options.fail != null && options.fail != undefined) {
                        options.fail(result);
                    }
                }
                //默认使用弹出消息、furion格式的
                if (options.isDefaultAlertMsg && options.isFurionResult) {
                    abc.tipMsg({ succeeded: result.Succeeded, errors: result.Errors, successMsg: options.successMsg, failMsg: options.failMsg });
                }
            },
            error: function (data) {
                layer.close(loading);
                // alert("下载模板失败！");
                console.log(data);

                //如果有完成方法，则调用
                if (options.error != null && options.error != undefined) {
                    options.error(result);
                }
                else {
                    abc.failure(abc.translate('提交失败'))
                }
            }
        });
    },
    /**
     *  Post 数据
     * @param {any} url //提交地址
     * @param {any} data  //提交数据
     * @param {any} surmsg  //提交确认消息
     * @param {any} success   //成功回调方法
     * @param {any} fail  //失败回调方法
     * @param {any} successmsg //成功弹框消息
     * @param {any} failmsg //失败弹框消息
     * {url:url,data:data,title:'请确认',surmsg:'确认要提交吗？',success:成功后执行方法,fail:失败后执行方法}
     */
    confirm: function (options) {
        options = options != undefined ? options : {};
        //url, data, surmsg, title = '请确认', table, isrefresh = true, tableid = 'listData'
        options.title = options.title != undefined ? options.title : abc.translate('警告，请确认');
        //options.isrefresh = options.isrefresh ? options.isrefresh : true;//成功后是否刷新
        options.btn = options.btn != undefined ? options.btn : [abc.translate('确定'), abc.translate('取消')];
        var $ = layui.jquery;
        layer = layui.layer;
        layer.confirm(options.surmsg, {
            icon: 3, //警告
            title: options.title,
            btn: options.btn//按钮
        }, function (index) {
            abc.post(options);
            layer.close(index);
        });
    },
    /**
     * layui 打开窗口
     * 常用参数：{ title:'新增', url:'@(Url.Action("Info"))', area:['600px', '700px'], end:完成后调用方法 }
     */
    open: function (options) {
        //title, url, area, tableid, table
        //tableid = tableid ? tableid : "listData";
        layer = layui.layer;
        options = options != undefined ? options : {};
        layer.open({
            type: 2, //0（信息框，默认）1（页面层）2（iframe层）3（加载层）4（tips层）
            area: options.area != undefined ? options.area : ['100%', '100%'],
            title: options.title, //弹框标题
            content: options.url, //内容
            shadeClose: options.shadeClose != undefined ? options.shadeClose : true, //是否点击遮罩关闭
            shade: options.shade != undefined ? options.shade : [0.9, '#2a2c2d54'], //shade - 默认是0.3透明度的黑色背景（'#000'）。如果你想定义别的颜色，可以shade: [0.8, '#393D49']；如果你不想显示遮罩，可以shade: 0
            maxmin: options.maxmin != undefined ? options.maxmin : true, //开启最大化最小化按钮
            btnAlign: options.btnAlign != undefined ? options.btnAlign : 'c', //按钮排列  左 l 中 c 右 r
            resize: options.resize != undefined ? options.resize : true, //是否允许拉伸,默认 true
            yes: options.yes != undefined ? options.yes : function (index) {
                layer.close(index);
            },
            end: options.end != undefined ? options.end : function () {
                if (options.end != null && options.end != undefined) {
                    options.end(); //
                }
            },
            success: options.success != undefined ? options.success : function (layero, index) {
                console.log(layero, index);
            }
        });
    },
    /**
     * 删除操作
     * {url:url,data:data,success:obj,fail:失败方法,surmsg:"确认要删除吗！！请谨慎操作"}
     */
    delete: function (options) {
        let $ = layui.jquery;
        let layer = layui.layer;

        options = options != undefined ? options : {};
        options.surmsg = options.surmsg != undefined ? options.surmsg : abc.translate("确认要删除吗！！请谨慎操作");
        options.title = options.title != undefined ? options.title : abc.translate("警告");
        options.btn = options.btn != undefined ? options.btn : [abc.translate('确定'), abc.translate('取消')];
        layer.confirm(options.surmsg, {
            icon: 3,
            title: options.title,
            btn: options.btn//按钮
        }, function (index) {
            layer.close(index);
            abc.post(options);
        });
    },
    /**
     * 文件上传
     * @param {any} upload //upload 对象
     * @param {any} uploadUrl //上传url地址
     * @param {any} elem   //上传按钮 id
     * @param {any} inputImgId //input img的id
     * @param {any} imgSrcId  //img src id
     */
    initFileUpLoad: function (options) {
        //upload, uploadUrl, elem, inputImgId, imgSrcId
        let $ = layui.jquery;
        options = options != undefined ? options : {};
        options.accept = options.accept != undefined ? options.accept : "file";
        //是否默认furion的统一返回格式，默认为true
        options.isFurionResult = options.isFurionResult != undefined ? options.isFurionResult : true;
        //是否弹出默认提示消息，默认返回格式为furion的统一返回格式对象,默认使用默认弹出消息
        options.isDefaultAlertMsg = options.isDefaultAlertMsg != undefined ? options.isDefaultAlertMsg : true;
        options.data = options.data != undefined ? options.data : {};
        options.data = abc.addRequestVerificationToken(options.data);
        layer = layui.layer;
        let upload = layui.upload;
        var loading;
        var uploadObj = upload.render({
            elem: '#' + options.elem // '#btn_img_upload'
            , elemList: options.elemList != undefined ? $('#' + options.elemList) : null //列表元素对象
            ,
            url: options.url //'@(Url.Action("ImgUpload"))?type=Rotation'
            // , field: "fileNames"     //添加这个属性与后台名称保存一致

            ,
            accept: 'file' //普通文件
            ,
            headers: options.headers //接口的请求头。如：headers: {token: 'sasasas'}
            //acceptMime: 'image/*'（只显示图片文件）
            //acceptMime: 'image/jpg, image/png'（只显示 jpg 和 png 文件）
            ,
            acceptMime: options.acceptMime //
            ,
            exts: options.exts //'zip|rar|7z' 即代表只允许上传压缩格式的文件
            ,
            auto: options.auto != undefined ? options.auto : true //
            ,
            bindAction: options.bindAction //指向一个按钮触发上传，一般配合 auto: false 来使用。值为选择器或DOM对象，如：bindAction: '#btn'
            ,
            field: options.field //设定文件域的字段名
            ,
            data: options.data,//携带的数据
            size: options.size != undefined ? options.size : 0 //设置文件最大可允许上传的大小，单位 KB。不支持ie8/9  ,0表示不限制
            ,
            multiple: options.multiple != undefined ? options.multiple : 0 //是否允许多文件上传。设置 true即可开启
            ,
            number: options.number != undefined ? options.number : 0 //设置同时可上传的文件数量，一般配合 multiple 参数出现 , 0表示不限制
            ,
            drag: options.drag != undefined ? options.drag : true //是否接受拖拽的文件上传，设置 false 可禁用。不支持ie8/9 ,默认true
            ,
            choose: options.choose //选择文件后的回调函数。返回一个object参数
            , progress: options.progress //上传进度回调函数
            , allDone: options.allDone //多文件上传完毕后的状态回调
            ,
            before: function (obj) { //obj参数包含的信息，跟 choose回调完全一致，可参见上文。

                loading = layer.load(); //上传loading
                if (options.before != undefined && options.before != null) {
                    options.before(obj);
                }
            },
            //返回三个参数，分别为：res（服务端响应信息）、index（当前文件的索引）、upload（重新上传的方法，一般在文件上传失败后使用）
            done: function (res, index, upload) {
                layer.closeAll('loading'); //关闭loading
                //默认使用弹出消息、furion格式的
                if (options.isDefaultAlertMsg && options.isFurionResult) {
                    abc.tipMsg({ succeeded: res.Succeeded, errors: res.Errors, successMsg: abc.translate("上传成功"), failMsg: abc.translate("上传失败") });
                }
                if (options.done != undefined && options.done != null) {
                    options.done(res, index, upload);
                }
            },
            //error: options.error,
            //done: function (res) {
            //    //$("#Image").val(res.data.src);
            //    // $("#upload_img").attr('src', res.data.httpsrc);
            //    $('#' + inputImgId).val(res.data.src);
            //    $('#' + imgSrcId).attr('src', res.data.httpsrc);
            //    console.log(res);
            //    layer.closeAll('loading'); //关闭loading
            //    abc.success("上传成功");
            //},
            error: function (index, upload) {
                layer.closeAll('loading'); //关闭loading
                if (options.error != undefined && options.error != null) {
                    options.error(index, upload);
                }
                else {
                    abc.failure(abc.translate('上传失败'));
                }
            }
        });

        return uploadObj;
    },
    /**
     *  CkEditor 初始化
     * @param {any} elemName //对象名字（id）
     */
    ckeditorInit: function (elemName) {
        //editorElement = CKEDITOR.document.getById('Content');
        //CKEDITOR.replace('Content');
        editorElement = CKEDITOR.document.getById(elemName);
        CKEDITOR.replace(elemName);
    },
    /**
     * CkEditor 获取数据
     * @param {any} elemName //对象名字（id）
     */
    ckeditorGetData: function (elemName) {
        return CKEDITOR.instances[elemName].getData();
    },
    //adminHomeRender: function () {
    //    body.on("click", ".refreshcache", function () {
    //        // 回调
    //        var result = logout();
    //        if (result) {
    //            // 清空缓存
    //            bodyTab.clear();
    //        }
    //    })
    //},
    refreshCache: function (options) {
        abc.post({ url: options.url, data: {} });
    },

    /**
     * 提示消息
     * succeeded 成功状态：true、false
     * errors 错误消息：字符串或对象
     * successMsg 成功消息
     * failMsg 失败消息
     * @param {any} options// {succeeded,successMsg,failMsg}
     */
    tipMsg: function (options) {
        if (options.succeeded) {
            options.successMsg = options.successMsg != undefined ? options.successMsg : abc.translate('操作成功');
            abc.success(options.successMsg);
        } else {
            options.failMsg = options.failMsg != undefined ? options.failMsg : abc.translate('操作失败');
            if (options.errors != undefined && options.errors != null && options.errors != '')
                options.failMsg = options.errors ? options.errors : options.failMsg;
            abc.failure(options.failMsg);
        }
    },
    /**
     * 成功消息
     * 0 警告 1成功 2 错误 3 疑问 4 锁定 5失败
     * @param {any} content  //消息内容
     * */
    success: function (content) {
        layer.msg(abc.getMsg(content), {
            zIndex: 999999999,
            icon: 1,
            time: 2000
        });
    },
    /**
     * 失败消息
     * @param {any} content  //消息内容
     * */
    failure: function (content, title) {
        title = title == undefined ? abc.translate("错误消息") : title;
        //layer.alert(abc.getMsg(content), {
        //    icon: 2,
        //    time: 2000
        //});
        var index = layer.alert(abc.getMsg(content), {
            zIndex: 999999999,
            icon: 5,
            shadeClose: false,
            title: title
        });
    },
    /**
     * 警告消息
     * @param {any} content  //消息内容
     * */
    warning: function (content, title) {
        title = title == undefined ? abc.translate("警告消息") : title;
        //layer.msg(abc.getMsg(content), {
        //    icon: 3,
        //    time: 2000!
        //});

        var index = layer.alert(content, {
            zIndex: 999999999,
            icon: 1,
            shadeClose: false,
            title: title
        });
    },
    /**
     * 获取消息（解析消息，对象转换为字符串）
     * @param {any} obj
     */
    getMsg: function (obj) {
        var msg = "";
        if (obj === null) return "</br>";
        var datatype = abc.getDataType(obj);
        if (datatype === 'object') {
            msg = abc.objectToString2(obj);
        } else if (datatype === 'string') {
            msg = obj;
        } else {
            msg = obj;
        }
        return msg;
    },
    /**
     * 获取数据类型 'string'|'number'|'bigint'|'boolean'|'symbol'|'undefined'|'object'|'function'
     * @param {any} obj
     */
    getDataType: function (obj) {
        return typeof obj;
    },
    /**
     * 对象转换为字符串（含字段属性名）
     * @param {any} arr
     */
    objectToString: function (arr) {
        var str = "";
        for (var datafield in arr) {
            str += datafield + ":" + arr[datafield] + "</br>";
        }
        //$(arr).each(function (index, item) {
        //    var a = item;
        //});
        return str;
    },
    /**
     * 对象转换为字符串
     * @param {any} arr
     */
    objectToString2: function (arr) {
        var str = "";
        for (var datafield in arr) {
            str += datafield + ':' + arr[datafield] + "</br>";
        }
        //$(arr).each(function (index, item) {
        //    var a = item;
        //});
        return str;
    },
    /**
     * 获取当前时间
     * 使用格式 ：年：yyyy月：MM日：dd时：hh分：mm秒：ss 毫秒：S
     * @param {any} format
     */
    getNowTime: function (format) {
        format = format ? format : "yyyy-MM-dd hh:mm:ss";
        var date = new Date();
        return date.Format(format);
    },
    /**
     * tinymce 初始化
     * @param {any} options
     */
    tinymceInit: function (options) {
        var tinymce = layui.tinymce;
        options.fileuploaddata = options.fileuploaddata != undefined ? options.fileuploaddata : {};
        options.fileuploaddata = abc.addRequestVerificationToken(options.fileuploaddata);
        //tinymce 文档 http://tinymce.ax-z.cn/plugins/autoresize.php
        var uploaditem = tinymce.render({
            elem: "#" + options.elem,
            language: 'zh_CN', //调用放在langs文件夹内的语言包
            //toolbar: options.toolbar != undefined ? options.toolbar : true, //隐藏工具栏
            menubar: options.menubar != undefined ? options.menubar : true, //隐藏菜单栏

            resize: options.resize != undefined ? options.resize : true,//调整编辑器大小工具,可选值为：true（仅允许改变高度）, false（完全不让你动）, 'both'（宽高都能改变，注意引号）
            height: options.height != undefined ? options.height : 400,//默认高度
            min_height: 400,
            autoresize_min_height: options.autoresize_min_height != undefined ? options.autoresize_min_height : 350,//最小高度
            autoresize_bottom_margin: options.autoresize_bottom_margin != undefined ? options.autoresize_bottom_margin : 50,
            //images_upload_url:'@(Url.Action("ImgUpload"))',
            paste_data_images: options.paste_data_images != undefined ? options.paste_data_images : true,
            images_file_types: options.images_file_types != undefined ? options.images_file_types : 'jpeg,jpg,.png,gif,bmp,webp,gif',
            convert_urls: false,//解决tinymce上传图片路径变为相对路径的解决办法
            images_upload_handler: function (blobInfo, success, failure) {
                //将图片转码为base64格式
                success("data:" + blobInfo.blob().type + ";base64," + blobInfo.base64());
            },

            plugins: options.plugins != undefined ? options.plugins : 'print preview searchreplace autolink directionality visualblocks visualchars fullscreen image link media template code codesample table charmap hr pagebreak nonbreaking anchor insertdatetime advlist lists wordcount imagetools textpattern help emoticons autosave  indent2em autoresize',
            toolbar: options.toolbar != undefined ? options.toolbar : 'code undo redo restoredraft | cut copy paste pastetext | forecolor backcolor bold italic underline strikethrough link anchor | alignleft aligncenter alignright alignjustify outdent indent | \
    styleselect formatselect fontselect fontsizeselect | bullist numlist | blockquote subscript superscript removeformat | \
    table image media charmap emoticons hr pagebreak insertdatetime print preview | fullscreen |  indent2em lineheight',
            fontsize_formats: options.fontsize_formats != undefined ? options.fontsize_formats : '12px 14px 16px 18px 24px 36px 48px 56px 72px',
            font_formats: options.font_formats != undefined ? options.font_formats : '微软雅黑=Microsoft YaHei,Helvetica Neue,PingFang SC,sans-serif;苹果苹方=PingFang SC,Microsoft YaHei,sans-serif;宋体=simsun,serif;仿宋体=FangSong,serif;黑体=SimHei,sans-serif;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;',
            importcss_append: true,
            toolbar_sticky: true,
            autosave_ask_before_unload: false,
            image_class_list: [
                { title: 'None', value: '' },
                { title: 'Some class', value: 'class-name' }
            ],
            //file_picker_types: '.pdf, .txt, .zip, .rar, .7z, .doc, .docx, .xls, .xlsx, .ppt, .pptx, .mp3, .mp4',
            //文件上传
            file_picker_callback: function (callback, value, meta) {
                //文件分类
                var filetype = options.filetype != undefined ? options.filetype : '.pdf, .txt, .zip, .rar, .7z, .doc, .docx, .xls, .xlsx, .ppt, .pptx, .mp3, .mp4';
                //为不同插件指定文件类型及后端地址
                switch (meta.filetype) {
                    case 'image':
                        filetype = '.jpg, .jpeg, .png, .gif';
                        //upurl = 'upimg.php';
                        break;
                    case 'media':
                        filetype = '.mp3, .mp4';
                        //upurl = 'upfile.php';
                        break;
                    case 'file':
                    default:
                }
                //模拟出一个input用于添加本地文件
                var input = document.createElement('input');
                input.setAttribute('type', 'file');
                input.setAttribute('accept', filetype);
                if (options.multiple != undefined && options.multiple != null && (options.multiple === true || options.multiple === 'multiple')) {
                    input.setAttribute('multiple', 'multiple');
                }
                input.click();
                input.onchange = function () {
                    var file = this.files[0];
                    var xhr, formData;
                    console.log(file.name);
                    xhr = new XMLHttpRequest();
                    xhr.withCredentials = false;
                    xhr.open('POST', options.url);//后端接收上传文件的地址
                    xhr.onload = function () {
                        var json;
                        if (xhr.status == 400) {
                            abc.failure(abc.translate('不允许提交'));
                            return;
                        }
                        else if (xhr.status == 403) {
                            abc.failure(abc.translate('没有权限'));
                            return;
                        } else if (xhr.status != 200) {
                            abc.failure(abc.translate('提交错误'));
                            return;
                        }
                        json = JSON.parse(xhr.responseText);
                        if (json.Succeeded == true) {
                        }
                        else {
                            abc.failure(json.Errors)
                        }
                        //if (!json || typeof json.Data.src != 'string') {
                        //    failure('Invalid JSON: ' + xhr.responseText);
                        //    return;
                        //}
                        callback(json.Data.src, { text: file.name, title: file.name });
                    };
                    formData = new FormData();
                    formData.append('file', file, file.name);
                    //formData.append("__RequestVerificationToken",$("[name='__RequestVerificationToken']").val())
                    //遍历设置的参数
                    $.each(options.fileuploaddata, function (index, ele) {
                        //console.log(index);
                        //console.log(ele);
                        formData.append(index, ele);
                    })
                    xhr.send(formData);
                };
            },
        });
        return uploaditem;
    },
    /*
     * 安全组件初始化
     */
    safeInit: function () {
        //layui.define(['jquery'], function () {
        //    var $ = layui.jquery;
        //    /*
        //     * 初始化 RequestVerificationToken
        //     */
        //    /*$(document).ready(function () {*/
        //    var _ajax = $.ajax;
        //    $.ajax = function (opts) {
        //        if (opts.data == undefined) {
        //            //实现自己的逻辑
        //            //opts.data = {};
        //            //opts.data["__RequestVerificationToken"] = $("[name='__RequestVerificationToken']").val();
        //            opts.data = abc.addRequestVerificationToken(opts.data);
        //        }
        //        else if (opts.data == '[object FormData]') {
        //            //var myform = new FormData();
        //            //myform.append('file', opts.data);
        //            //myform.append('__RequestVerificationToken', $("[name='__RequestVerificationToken']").val());
        //            //opts.data=myform;
        //        }
        //        else {
        //            //实现自己的逻辑
        //            //opts.data["__RequestVerificationToken"] = $("[name='__RequestVerificationToken']").val();
        //            opts.data = abc.addRequestVerificationToken(opts.data);
        //        }
        //        _ajax(opts);
        //    };
        //});
    },
    /**
     * 添加提交安全token
     * @param {any} data
     */
    addRequestVerificationToken: function (data) {
        if (data == undefined) data = {};

        //添加安全参数
        if (data["__RequestVerificationToken"] == undefined) {
            var requestVerificationToken = $("[name='__RequestVerificationToken']").val();
            if (requestVerificationToken != null && requestVerificationToken != undefined && requestVerificationToken != "") {
                data["__RequestVerificationToken"] = requestVerificationToken;
            }
        }
        return data;
    },
    /**
     * 日期格式化
     * //调用：
     * Format("yyyy-MM-dd");
     * Format("yyyy-MM-dd HH:mm:ss");
     * @param {any} date  //日期
     * @param {any} fmt   //格式
     */
    dateFormat: function (date, fmt) {
        var o = {
            "M+": date.getMonth() + 1, //月份
            "d+": date.getDate(), //日
            "h+": date.getHours(), //小时
            "m+": date.getMinutes(), //分
            "s+": date.getSeconds(), //秒
            "q+": Math.floor((date.getMonth() + 3) / 3), //季度
            "S": this.getMilliseconds() //毫秒
        };
        if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
        for (var k in o)
            if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
        return fmt;
    },
    /**
     * 多语种切换
     * @param {any} culture  //语种
     */
    languageSwitch: function (culture) {
        //包含参数
        if (window.location.href.indexOf("?") != -1) {
            //检查第一个参数是否是语言参数
            if (window.location.search.indexOf("?culture") == -1) {
                //检查后面是否包含语言参数
                if (window.location.search.indexOf("&culture") == -1) {
                    window.location.href = window.location.href.replace("#", "") + "&culture=" + culture;
                } else {
                    var strindex = window.location.href.lastIndexOf('=');
                    window.location.href = window.location.href.substring(0, strindex).replace("#", "") + "=" + culture;
                }
            } else {
                window.location.href = window.location.protocol + "//" + window.location.host + window.location.pathname.replace("#", "") + "?culture=" + culture;
            }
        } else {
            window.location.href = window.location.href.replace("#", "") + "?culture=" + culture;
        }
    },
    /**
     * 当前语种，默认是空的，需要调用 getCulture 获取
     */
    lang: "",
    /**
     * 获取当前语种代码：zh-CN、en-US
     * @returns 返回语种代码
     */
    getCulture: function () {
        //获取url地址栏中的语种
        var culture = app.GetQueryString("culture");
        //获取asp.net core 存储的culture
        if (culture == undefined || culture == '') {
            //Cookie: c%3Den-US%7Cuic%3Den-USen-US
            //明文格式为：c=en-US|uic=en-US
            var str = app.Cookie.get(".AspNetCore.Culture")
            if (str != undefined && str != null && str != '') {
                str = decodeURIComponent(str);//解码
                if (str.indexOf('|') != -1 && str.indexOf('c=') != -1 && str.indexOf('uic=')) {
                    var arr = str.split('|');
                    if (arr.length == 2) {
                        if (arr[0].indexOf('=') != -1) {
                            var arr2 = arr[0].split('=');
                            if (arr2.length == 2) {
                                culture = arr[0].split('=')[1];
                            }
                        }
                    }
                }
            }
        }

        //获取asp.net core 自定义设置的culture
        if (culture == undefined || culture == '') {
            //Cookie: c%3Den-US%7Cuic%3Den-USen-US
            //明文格式为：c=en-US|uic=en-US
            var str = app.Cookie.get("Abc.Culture")
            if (str != undefined && str != null && str != '') {
                str = decodeURIComponent(str);//解码
                if (str.indexOf('|') != -1 && str.indexOf('c=') != -1 && str.indexOf('uic=')) {
                    var arr = str.split('|');
                    if (arr.length == 2) {
                        if (arr[0].indexOf('=') != -1) {
                            var arr2 = arr[0].split('=');
                            if (arr2.length == 2) {
                                culture = arr[0].split('=')[1];
                            }
                        }
                    }
                }
            }
        }

        //获取浏览器的语言
        if (culture == undefined || culture == '') {
            var jsSrc = (navigator.language || navigator.browserLanguage).toLowerCase();
            if (jsSrc.indexOf('zh') != -1) {
                // 浏览器语言是中文
                culture = "zh-CN";
            }
            else if (jsSrc.indexOf('en') != -1) {
                // 浏览器语言是英文
                culture = "en-US";
            }
            else {
                // 浏览器语言是其它
                culture = "zh-CN";
            }
        }

        return culture;
    },
    /**
    * 获取Url地址中的参数
    * @param {string} name 
    * @returns 
    */
    GetQueryString: function (name) {
        var query = window.location.search.substring(1);
        var vars = query.split("&");
        for (var i = 0; i < vars.length; i++) {
            var pair = vars[i].split("=");
            //如果key=name或者key转换为小写=name转换为小写
            if (pair[0] == name || pair[0].toLowerCase() == name.toLowerCase()) {
                var v = decodeURIComponent(pair[1]);
                return v == null || v == "" || v == "undefined" ? "" : v;
            }
        }
        return (false);
    },
    /**
    * 翻译
    * @param {string} content 
    * @param {string} culture //语种代码 zh-CN、en-US 等等
    * @returns 
    */
    translate: function (content, culture, newLanguages) {

        //如果设置的lang不为空，则使用设置的
        if (culture == undefined || culture == null || culture == '') {
            culture = abc.lang;
        }

        //如果传入的语种代码没有设置，则获取
        if (culture == undefined || culture == null || culture == '') {
            culture = app.getCulture();
        }
        //如果有语种代码，则进入进行翻译
        if (culture != undefined && culture != null && culture != '') {
            //如果翻译的对象为空，则使用默认的
            if (newLanguages == undefined || newLanguages == null) {
                newLanguages = languageContents;
            }
            var str = newLanguages[content][culture];
            if (str == undefined || str == null || str == '') {
                return content;
            }
            else return str;
        }
        else {
            return content;
        }
    },
    ///**
    // * 获取Url地址中的参数
    // * @param {string} name 
    // * @returns 
    // */
    //GetQueryString2: function (name) {
    //    var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
    //    var r = window.location.search.substring(1).match(reg); //获取url中"?"符后的字符串并正则匹配
    //    var context = "";
    //    if (r != null)
    //        context = decodeURIComponent(r[2]);
    //    reg = null;
    //    r = null;
    //    return context == null || context == "" || context == "undefined" ? "" : context;
    //},

    /**
     *字典
     */
    Dictionary: function () {
        this.dataStore = new Array(); // 定义一个数组，保存字典元素
        //this.add = abcDic.add;               // 添加字典内容(key:value)
        //this.show = abcDic.show;             // 显示字典中的键值
        //this.find = abcDic.find;             // 根据键(key)查找并返回对应的值(value)
        //this.remove = abcDic.remove;         // 删掉相对应的键值
        //this.count = abcDic.count;           // 计算字典中的元素的个数
        //this.kSort = abcDic.kSort;           // 按键(key)排序
        //this.vSort = abcDic.vSort;           // 按值(value)排序
        //this.clear = abcDic.clear;           // 清空字典内容

        /**
         * 添加字典的键值(key:value)
         * @param {any} key
         * @param {any} value
         */
        this.add = function (key, value) {
            this.dataStore[key] = value;
        };
        /**
         * 显示字典中的键值(key:value)
         */
        this.show = function () {
            for (var key in this.dataStore) {
                console.log(key + " : " + this.dataStore[key]);
            }
        };
        /**
         * 根据键(key)查找对应的值(value),返回值value
         * @param {any} key
         */
        this.find = function (key) {
            return this.dataStore[key];
        };
        /**
         * 根据键(key)删除对应的值(value)
         * @param {any} key
         */
        this.remove = function (key) {
            delete this.dataStore[key];
        };
        /**
         * 计算字典中的元素个数
         */
        this.count = function () {
            var n = 0;
            for (var key in Object.keys(this.dataStore)) {
                ++n;
            }
            return n;
        };
        /**
         * 字典按值(value)排序,并输出排序后的结果
         */
        this.kSort = function () {
            var dic = this.dataStore;
            var res = Object.keys(dic).sort();
            for (var key in res) {
                console.log(res[key] + " : " + dic[res[key]]);
            }
        };
        /**
         * 字典按值(value)排序,并输出排序后的结果
         */
        this.vSort = function () {
            var dic = this.dataStore;
            var res = Object.keys(dic).sort(function (a, b) {
                return dic[a] - dic[b];
            });
            for (var key in res) {
                console.log(res[key] + " : " + dic[res[key]]);
            }
        };
        /**
         * 清空字典内容
         */
        this.clear = function () {
            for (var key in this.dataStore) {
                delete this.dataStore[key];
            }
        };
        /**
         * 获取字典值列表
         */
        this.list = function () {
            var arr = [];
            for (var key in this.dataStore) {
                arr.push(this.dataStore[key]);
            }
            return arr;
        }
    },
    /**
     * 复制文本到剪贴板
     * */
    copyText: function (text) {
        var textarea = document.createElement("input");//创建input对象
        var currentFocus = document.activeElement;//当前获得焦点的元素
        document.body.appendChild(textarea);//添加元素
        textarea.value = text;
        textarea.focus();
        if (textarea.setSelectionRange)
            textarea.setSelectionRange(0, textarea.value.length);//获取光标起始位置到结束位置
        else
            textarea.select();
        try {
            var flag = document.execCommand("copy");//执行复制
        } catch (eo) {
            var flag = false;
        }
        document.body.removeChild(textarea);//删除元素
        currentFocus.focus();
        return flag;
    },
    /**
     * Cookie
     */
    Cookie: {
        /**
         * 设置cookie
         * @param {string} key //关键词
         * @param {string} value //值
         * @param {int} exdays //天数
         */
        set: function (key, value, exdays) {
            let exdate = new Date() // 获取时间
            exdate.setTime(exdate.getTime() + 24 * 60 * 60 * 1000 * exdays) // 保存的天数
            // 字符串拼接cookie
            // eslint-disable-next-line camelcase
            window.document.cookie = key + '=' + value + ';path=/;expires=' + exdate.toGMTString()
        },
        /**
         * 获取cookie
         * @param {string} key //关键词
         * @returns 
         */
        get: function (key) {
            if (document.cookie.length > 0) {
                var arr = document.cookie.split('; ') // 这里显示的格式需要切割一下自己可输出看下
                for (let i = 0; i < arr.length; i++) {
                    let arr2 = arr[i].split('=') // 再次切割
                    // 判断查找相对应的值
                    if (arr2[0] === key) {
                        return arr2[1]
                    }
                }
            }
        },
        /**
         * 移除cookie
         * @param {string} key //关键词
         */
        remove: function (key) {
            set(key, '', -1);
        }
    },
    /**
     * 动态加载js
     * @param {any} url
     * @param {any} callback
     */
    loadJS: function (url, callback) {

        var script = document.createElement('script');
        var fn = callback || function () { };
        script.type = 'text/javascript';
        //IE
        if (script.readyState) {
            script.onreadystatechange = function () {
                if (script.readyState == 'loaded' || script.readyState == 'complete') {
                    script.onreadystatechange = null;
                    fn();
                }
            };
        } else {
            //其他浏览器
            script.onload = function () {
                fn();
            };

        }
        script.src = url;
        document.getElementsByTagName('head')[0].appendChild(script);
    }
}
/**
 * 翻译的内容
 */
var languageContents = {
    "无数据": {
        "en-US": "no data"
    },
    "刷新": {
        "en-US": "refresh"
    },
    "获取失败": {
        "en-US": "get failed"
    },
    "提交失败": {
        "en-US": "submit failed"
    }, "警告，请确认": {
        "en-US": "warning, please confirm"
    },
    "确定": {
        "en-US": "sure"
    },
    "取消": {
        "en-US": "cancel"
    },
    "确认要删除吗！！请谨慎操作": {
        "en-US": "Are you sure you want to delete it!! Please operate with caution"
    },
    "警告": {
        "en-US": "warning"
    },
    "上传成功": {
        "en-US": "upload successful"
    },
    "上传失败": {
        "en-US": "upload failed"
    },
    "操作成功": {
        "en-US": "operation successful"
    },
    "操作失败": {
        "en-US": "operation failed"
    },
    "错误消息": {
        "en-US": "error"
    },
    "错误消息": {
        "en-US": "warning"
    },
    "不允许提交": {
        "en-US": "Submission not allowed"
    },
    "没有权限": {
        "en-US": "no permission"
    },
    "提交错误": {
        "en-US": "Submission error"
    }
};

/*
 * <script src="~/lib/ckeditor4/ckeditor.js"></script>
 * obj.field.Remark = Remark.getContent();
 *
 form.verify({
            Name: function (value) {
                if (value <= 0) {
                    return 'Name不能为空';
                }
            },
            Money: [
                /^(([1-9][0-9]*)|(([0]\.\d{1,2}|[1-9][0-9]*\.\d{1,2})))$/
                ,'支付金额错误，最多2位小数，不能以小数点结尾'
            ],
        });
*/
/*
 * <script src="~/lib/ckeditor4/ckeditor.js"></script>
 * obj.field.Remark = Remark.getContent();
 *
 form.verify({
            Name: function (value) {
                if (value <= 0) {
                    return 'Name不能为空';
                }
            },
            Money: [
                /^(([1-9][0-9]*)|(([0]\.\d{1,2}|[1-9][0-9]*\.\d{1,2})))$/
                ,'支付金额错误，最多2位小数，不能以小数点结尾'
            ],
        });
*/

/**
 * js正则表达式库--
 * @用法:  Reg.en.test('abc')  ->  true
 * 来源：https://blog.csdn.net/qq_39121810/article/details/107346870
 */

var reg = {
    /*
     * 数字相关
     */
    //正数（可含小数、0）
    posiNum: /^[+]{0,1}(\d+)$|^[+]{0,1}(\d+\.\d+)$/,

    //正整数
    posiInt: /^[1-9]\d*$/,

    //0或正整数
    posiInt0: /^(0|[1-9][0-9]*)$/,

    //2位的数字
    numLen2: /^[0-9]{2}$/,

    // 2-3位的数字：
    numLen2or3: /^\d{1,3}$/,

    // 非零开头的最多带两位小数的正数：
    posiFloat2: /^([1-9][0-9]*)+(\.[0-9]{1,2})?$/,

    // 带1-2位小数的正数或+负数：
    float1or2: /^(\-)?\d+(.\d{1,2})?$/,

    // 非零的负整数：
    negativeInt: /^-[1-9]\d*$/,

    // 负数或0：
    negative0: /^-[1-9]\d*|0$/,

    // 负整数或0：
    negativeInt0: /^(-[1-9]\d*|0)$/,

    // 负浮点数：
    negativeFloat: /^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$/,

    // 正浮点数：
    posiFloat: /^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$/,

    // 浮点数：
    float: /^(-?\d+)(\.\d+)?$/,

    /*
     * 字符相关
     */

    // 英文和数字：
    numEn: /^[A-Za-z0-9]+$/,

    // 长度为2-4的所有字符：
    en2to4: /^.{2,4}$/,

    // 英文字母：
    En: /^[A-Za-z]+$/,

    // 大写英文字母：
    EN: /^[A-Z]+$/,

    // 小写英文字母：
    en: /^[a-z]+$/,

    // 小写英文字母：
    cn: /^[\u4E00-\u9FA5A]+$/,

    // 数字、字母、下划线
    numEn_: /^\w+$/,

    // 中文、英文、数字、下划线：
    numEnCn_: /^[\u4E00-\u9FA5A-Za-z0-9_]+$/,

    // 中文、英文、数字：
    numEnCn: /^[\u4E00-\u9FA5A-Za-z0-9]+$/,

    // 含有^%&',;=?$\”等字符：
    illegal: /[^%&',;=?$\x22]+/,

    // Email地址：
    email: /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/,

    // 护照：
    passport: /^1[45][0-9]{7}|G[0-9]{8}|P[0-9]{7}|S[0-9]{7,8}|D[0-9]+$/,

    // 手机号码：
    mobile: /^1[3456789]\d{9}$/,

    // 座机号码:
    telephone: /0\d{2,3}-\d{5,9}|0\d{2,3}-\d{5,9}/,

    // 座机或手机号:
    teleMobile: /^((0\d{2,3}-\d{5,9}|0\d{2,3}-\d{5,9})|(1[3456789]\d{9}))$/,

    // 身份证号(15位、18位数字)：
    idCard: /^(^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$)|(^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])((\d{4})|\d{3}[Xx])$)$/,

    // 日期： 2017-1-1或2017/1/1
    date: /^\d{4}(-|\/)\d{1,2}(-|\/)\d{1,2}$/,

    // 时间： 10:00:00
    time: /^([01]?\d|2[0-3]):[0-5]?\d:[0-5]?\d$/,

    // 日期+时间： 2017-1-1 10:00:00
    datetime: /^\d{4}(-|\/)\d{1,2}(-|\/)\d{1,2}\s([01]?\d|2[0-3]):[0-5]?\d:[0-5]?\d$/,

    // 一年的12个月(01～09和1～12)：
    month: /^(0?[1-9]|1[0-2])$/,

    // 一个月的31天(01～09和1～31)：
    day: /^((0?[1-9])|((1|2)[0-9])|30|31)$/,

    //腾讯QQ号：
    qq: /[1-9][0-9]{4,}/,

    //中国邮政编码：
    postcode: /[1-9]\d{5}(?!\d)/,

    //IP地址：
    //ip: /\d+\.\d+\.\d+\.\d+/,
    ip: /^((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])$/,

    //域名：
    url: /^(?=^.{3,255}$)(http(s)?:\/\/)?(www\.)?[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(\.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+(:\d+)*(\/\w+\.\w+)*([\?&]\w+=\w*)*/,

    //域名(http开头):
    urlHttp: /^((ht|f)tps?):\/\/[\w\-]+(\.[\w\-]+)+([\w\-\.,@?^=%&:\/~\+#]*[\w\-\@?^=%&\/~\+#])?$/,

    // 车牌:
    licencePlate: /^[京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领A-Z]{1}[A-Z]{1}[A-Z0-9]{4}[A-Z0-9挂学警港澳]{1}$/,

    //银行卡：
    bankCardNum: /^([1-9]{1})(\d{15}|\d{18})$/,

    //价格：
    price: /(^[1-9]\d*(\.\d{1,2})?$)|(^[0]{1}(\.\d{1,2})?$)/,

    //账号
    account: /^[A-Za-z0-9@_-]{4,20}$/,
    //密码
    pwd: /^[A-Za-z0-9~！@#￥%^&*()+-=.]{6,20}$/,
};


/**
 * 初始化
 */
$(function () {
    //layui.define(['form'], function () {
    //    var $ = layui.jquery;
    //    var form = layui.form;

    //关闭当前窗口
    $(".closewindow").on('click', function () {
        //当你在iframe页面关闭自身时
        if (parent != null && parent.layer != null) {
            var index = parent.layer.getFrameIndex(window.name); //先得到当前iframe层的索引
            parent.layer.close(index); //再执行关闭
        }
    });
    //刷新当前页面
    $(".refreshwindow").on('click', function () {
        location.reload();
    });
    //abc.loadJS("/lib/axios/axios.min.js", function () {
    //    addAxios();
    //    //axios.get("https://www.baidu.com");
    //});
    abc.loadJS("/lib/ajaxhook/ajaxhook.min.js", function () {
        //ah.hook({
        //    onreadystatechange: function (xhr) {
        //        console.log("onreadystatechange called: %O", xhr)
        //    },
        //    onload: function (xhr) {
        //        console.log("onload called: %O", xhr)
        //        // xhr.getProxy().responseText='xhr.responseText'
        //        this.responseText = "hookAjax" + xhr.responseText;
        //    },
        //    onloadend: function (xhr) {
        //        console.log("onloaded called: %O", xhr)
        //        // xhr.getProxy().responseText='xhr.responseText'
        //        this.responseText = "hookAjax" + xhr.responseText;
        //    },
        //    open: function (arg, xhr) {
        //        console.log("open called: method:%s,url:%s,async:%s", arg[0], arg[1], arg[2], xhr)
        //        //add tag
        //        //arg[1] += "?hook_tag=1";

        //    },
        //    send: function (arg, xhr) {
        //        console.log("send called: %O", arg[0])
        //        xhr.setRequestHeader("_custom_header_", "ajaxhook")
        //    },
        //    setRequestHeader: function (args, xhr) {
        //        console.log("setRequestHeader called!", args)
        //    }
        //})

        //初始化 ajaxhook  proxy
        ah.proxy({
            onRequest: (config, handler) => {
                //console.log(config.url)

                if (config.url != null && config.url.toLowerCase().endsWith(".json") || config.method.toLowerCase() != "post") {
                    //如果是json文件，什么都不做
                }
                else {

                    //abc.addRequestVerificationToken(options.data);
                    if (config.body instanceof FormData) {
                        //const formData = new FormData();
                        //formData.append("files", config.body);
                        //formData.append("__RequestVerificationToken", $("[name='__RequestVerificationToken']").val());
                        //config.body = formData;
                    }
                    else if (config.body == null || config.body == undefined)
                    {
                        config.body = "__RequestVerificationToken=" + $("[name='__RequestVerificationToken']").val();
                    }
                    else if (typeof (config.body) == 'string') {
                        if ((config.body == null || config.body.indexOf("__RequestVerificationToken") === -1)) {
                            if (config.body == null) config.body = "";
                            config.body += "&__RequestVerificationToken=" + $("[name='__RequestVerificationToken']").val();
                        }
                    }
                    else {
                       //暂时没有处理方式
                    }



                }
                handler.next(config);
            },
            onError: (err, handler) => {
                //console.log(err.type)
                handler.next(err)

            },
            onResponse: (response, handler) => {
                //console.log( response.response)
                handler.next(response)

            }
        })

    });



    /* });*/
});//()

function addAxios() {
    //axios.defaults.baseURL = '/'

    // 添加请求拦截器
    axios.interceptors.request.use(function (config) {
        // 在发送请求之前做些什么
        // debugger
        if (localStorage.getItem('token')) {
            config.headers.Authorization = localStorage.getItem('token')
        }
        return config;
        // config 请求报文 请求地址 请求方法 请求头 请求体
        console.log('请求拦截');
    }, function (error) {
        // 对请求错误做些什么
        // debugger
        return Promise.reject(error);
    });

    // 添加响应拦截器
    axios.interceptors.response.use(function (response) {
        // 对响应数据做点什么
        // debugger
        return response;
        // response响应报文
    }, function (error) {
        // 对响应错误做点什么
        // debugger
        //Toast.fail(error.response.data.message)
        //if (error.response.status === 401) {
        //    location.href = './login.html'
        //}
        console.log('响应拦截');
        return Promise.reject(error);
    });

    //const xhr = window.XMLHttpRequest;
    //const oldOpen = xhr.prototype.open;
    //xhr.prototype.open = function (method, url, async, user, password) {
    //    this.addEventListener('readystatechange', function () {
    //        if (this.readyState === 4) {
    //            const instance = axios.create({
    //                //baseURL: 'https://api.example.com',
    //                //timeout: 1000,
    //                //headers: { 'X-Custom-Header': 'foobar' }
    //            });
    //            instance.interceptors.request.use(function (config) {
    //                // 在发送请求之前做些什么
    //                console.log('请求拦截器', config);
    //                return config;
    //            }, function (error) {
    //                // 对请求错误做些什么
    //                //console.log('请求错误', error);
    //                return Promise.reject(error);
    //            });
    //            instance.interceptors.response.use(function (response) {
    //                // 对响应数据做点什么
    //                console.log('响应拦截器', response);
    //                return response;
    //            }, function (error) {
    //                // 对响应错误做点什么
    //                //console.log('响应错误', error);
    //                return Promise.reject(error);
    //            });
    //            //instance({
    //            //    method: method,
    //            //    url: url,
    //            //    data: this.response,
    //            //    headers: {
    //            //        'Content-Type': 'application/json'
    //            //    }
    //            //});
    //        }
    //    }, false);
    //    oldOpen.call(this, method, url, async, user, password);
    //};

}





//加载安全初始化
//abc.safeInit();